
/**
 * 防抖：连续触发事件，n秒内不触发事件，则执行回调
 * 如果n秒内又触发了事件，就重新计算
*/
function add(a, b) {
  return a + b
}
const fn = debounce(add, 2000)
function debounce(fn, wait) {
  var timer = null;

  return function () {
    var context = this,
      args = [...arguments];

    // 如果此时存在定时器的话，则取消之前的定时器重新记时
    if (timer) {
      clearTimeout(timer);
      timer = null;
    }

    // 设置定时器，使事件间隔指定事件后执行
    timer = setTimeout(() => {
      fn.apply(context, args);
    }, wait);
  };
}


/**
 * 节流
 * 固定n秒后执行
 */

function throttle(fn, delay) {
  let preTime = Date.now() // 获取使用节流函数时间
  return function () {
    let context = this
    let args = [...arguments]
    let nowTime = Date.now()
    if (nowTime - nowTime >= delay) {
      preTime = Date.now()
      return fn.apply(context, args);
    }
  }
}

function throttle1(fn, delay) {

  let timeout = null
  return function () {
    let context = this
    let args = [...arguments]
    if (!timeout) {
      timeout = setTimeout(() => {
        fn.apply(context, args)
        timeout = null
      }, delay)

    }
  }
}
